/*写一个服务器:接受客户的消息打印输出*/
#include <sys/types.h>			/* See NOTES */
#include <sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include<string.h>
int main()
{

	//1.socket创建一个套接字
	int sockfd=socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd==-1)
	{
		perror("socket fail");
		exit(-1);
	}
	printf("创建套接字成功\n");

	
	//2.bind 设置本服务器 IP地址+端口
	int res;
	struct sockaddr_in addr;
	memset(&addr,0,sizeof(addr));
	addr.sin_family=AF_INET;
	addr.sin_port=htons(49999);//把端口号 转换成 网络字节序
	struct in_addr ip;//保存转换成成功后的IP地址
	inet_aton("192.168.31.114",&ip);//点分十进制，转换成struct in_addr的IP地址
	addr.sin_addr=ip;
    res=bind(sockfd, (struct sockaddr *)&addr,sizeof(addr));
	if(res==-1)
	{
		perror("bind fail");
		exit(-1);
	}
	printf("设置绑定的IP地址和端口号成功\n");
	
	//3.listen 设置监听队列（等待客户端的连接数）
	res=listen(sockfd, 5);
	if(res==-1)
	{
		perror("listen fail");
		exit(-1);
	}
	printf("创建监听队列成功\n");

	
	//4.accept 等待请求（已经有客户连接了）
	struct sockaddr_in  clientAddr;//保存连接的客户端的IP+端口号 IPV4的地址结构体
	int addrlen=sizeof(clientAddr);
	int clientfd=accept(sockfd,(struct sockaddr *)&clientAddr, &addrlen);
	if(clientfd==-1)
	{
		perror("accept fail");
		exit(-1);
	}
	printf("接收客户端成功  成功建立连接\n");


	
	//5.read 接受客户端发来的消息
	while(1)
	{
		char buf[1024]={0};//保存接受客户端发来的消息
		int hasReadBytes=read(clientfd,buf,sizeof(buf));//从客户端读
		if(hasReadBytes==-1)
		{
			perror("read fail");
			exit(-1);
		}
		if(strcmp(buf,"quite\n")==0)
		{
			break;
		}
		printf("读到的内容：%s读到的字节数：%d\n",buf,hasReadBytes);
	}


	//3.往客户端发送消息 write
	while(1)
	{
		char buf[1024]={0};
		fgets(buf,sizeof(buf),stdin);
		res=write(clientfd,buf,strlen(buf));
		if(res==-1)
		{
			perror("write fail");
			exit(-1);
		}
		if(strcmp(buf,"quite\n")==0)
		{
			break;
		}
		printf("发送消息的内容是%s,成功发送的字节数是:%d\n",buf,res);
	}






	//6.关闭服务器
	close(clientfd);
	close(sockfd);



	return 0;
}







